﻿/**************************************************************************
 * 作者:张钿
 *
 * 版本信息
 * V1.7 2024-12-10
 * 1. 修复进度条不刷新进度，直接跳转至100%问题
 * 2. 使用do while(0)及卫语句优化部分if-else层级
 *
 * V1.8 2025-1-14
 * 1. 修改config.json配置文件，在测试用例模板配置中增加测试地点和ISA阶段列配置
 * 2. 索引页中增加版本号，测试地点，ISA阶段列汇总
 * 3. 将创建超级链接函数改为单独一行，在生成测试用例阶段调用
 *
 *
 * V1.9 2025-02-25
 * 1. 修改当自定义模板及配置文件单选框勾选后，模板配置与使用模板下拉框仍然自动联动
 * 2. 更新软件内置的现场测试用例模板
 * 3. 索引页增加"实验类型"、"备注"列
 * 4. 部分配置使用宏定义
 *
 * V1.10 2025-02-28
 * 1. 修改config.json文件格式
 * 2. 更新软件内置的现场测试用例模板
 * 3. 部分配置使用宏定义
 * 4. 增加对勾选内容是否匹配的检查，如不匹配，则在错误日志中记录
 * 5. 去掉测试用例起始行选择
 * 6. 更新使用手册
 *
 * V1.11 2025-04-09
 * 1. 标题栏增加图标
 * 2. 使用Qt6.9编译
 *
 * V2.0 2025-05-09
 * 1. 使用libxlsxwriter开源库增加页眉页脚设置功能
 * 2. 更新模板和配置文件
 *
 * V2.1 2025-05-15
 * 1. 更正软件自带的现场用例模板文件中SAT用例模板部分字体不一致问题
 *
 * V2.2 2025-05-20
 * 1. 优化单元格行高计算
 * 2. 增加对输入表格中需要勾选的内容与模板勾选框内容对比检查
 * 3. 修复部分bug
 *
 * V2.3 2025-05-21
 * 1. 解决Win7系统下页眉页脚分割线过长问题
 *
 * V2.4 2025-06-11
 * 1. 更新软件自带config.json，将索引表中标题“遍历”变更为“测试地点”
 *
 * V2.5 2025-09-04
 * 1. 增加代码健壮性，优化
 * 2. 增加部分图标，调整尺寸
 *
 * V2.6 2025-09-08
 * 1. UI界面美化
 *
 * V2.7 2025-09-16
 * 1. 优化性能
**************************************************************************/


#ifndef MAINWINDOW_H
#define MAINWINDOW_H



#include <QMainWindow>
#include "ui_mainwindow.h"
#include "configreader.h"
#include "QXlsx/xlsxdocument.h"
#include "QXlsx/xlsxworksheet.h"
#include "QXlsx/xlsxworkbook.h"
#include "QXlsx/xlsxformat.h"
#include <QComboBox>
#include "xlsxwriter.h"



QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE



#define VERSION ("V2.7")




// #define CASE_NUM u8"用例编号"
// #define CASE_TITLE u8"用例标题列"
// #define CASE_TEST_STEP u8"测试步骤列"
// #define CASE_EXPECT_RESULT u8"期望结果列"
// #define CASE_TEST_LOCATION u8"测试地点列"
// #define CASE_VER u8"用例版本列"
// #define CASE_TEST_TYPE u8"实验类型列"
// #define CASE_ISA_PHASE u8"ISA阶段列"
// #define CASE_NOTE u8"备注列"
#define CASE_SPLIT_CHAR u8"/"
#define CASE_CHECKBOX u8"□"


#define DEFAULT_CONFIG_PATH u8":/Config/config.json"
#define DEFAULT_TEMPLATE_PATH u8":/Config/defaultTemplate.xlsx"

#define HEADER_LEFT_MARGIN 1
#define HEADER_RIGHT_MARGIN 0.6
#define HEADER_TOP_MARGIN 1.3
#define HEADER_BOTTOM_MARGIN 0.8



class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QString dialogPopout(const QString& fileFormat);

    bool checkStepAndResult(const QStringList& compareList, const QString& caseNumber, int& stepCount);

    QStringList clearText(const QString& text);

    bool createOutputFile();
    void saveOutputFile();
    void writeErrorCaseToFile(const QString& filePath);
    // bool styleCheck(QString str, QString regexStr);
    void addComboboxItems(QComboBox *comboBox, const QString& filePath, const int& defaultIndex = 0);
    // QXlsx::Worksheet* createIndexSheet(QXlsx::Document* doc, QString sheetName, QXlsx::Format format);
    // void createHyperLink(QXlsx::Document *excel, QXlsx::Worksheet *srcSht, int readRow, int writeRow, QString caseName);
    void writeCase();
    lxw_worksheet* createSheetByName(const char* sheetName);
    void setSheetFormat(const QString& header);
    void copyHeaderFromTemplate();
    void formatCopy(const QXlsx::Format&, lxw_format* dst);
    // void writeTextWithSuffix(int row);

    /*
     * @Brief：根据模板合并单元格
     * @param start: 模板的起始行
     * @param end: 模板的结束行
     * @param offset: 模板的起始行与目标文件的起始行的偏移量
     * @param flag: 是否需要重复复制模板的起始行，如果为true，则重复复制模板的起始行，共复制count(见参数count)行
     * @param count: 需要重复复制的行数，搭配参数flag使用，只有flag为true时生效
     * @return : None
     */
    void mergeCellsByTemplate(const int& start, const int& end, const int& offset, const bool& flag = false, const int& count = 1);
    void writeHeaderContext(const int& srcSheetRow, const QString& caseName);
    void writeTitleToIndexsheet(lxw_worksheet* const sheet, const int& writeRow);
    void writeCaseInfoToIndexsheet(lxw_worksheet* const sheet, const int& readRow, const int& writeRow);
    void copyRowHeight(const int& srcRow);
    void copyColWidth(const int& srcCol);
    void writeContextByMapping(
        const int& srcRow,
        const int& stepStartRow,
        const QStringList& strList,
        const QList<int>& dst_col_arr,
        const QString& caseName);
    int calRowHeight(const QString& str, const int& tmpRow, const int& tmpCol);
    void writeTestStepAndResult(const int& stepStartRow, const QStringList& strList, const QList<int>& dst_col_arr);
    void copyTailContextFromTemplate(const int& srcStart, const int& srcEnd, const int& offset);
    bool checkedByString(const int& row, const int& col, QString str);


public slots:
    void toolButtonConfigSlots();
    void toolButtonCaseSlots();
    void toolButtonSatSlots();
    void pushButtonGenerateSlots();
    void checkBoxToggledSlots();
    void configComboBoxChangedSlots();

private:
    Ui::MainWindow *ui;
    ConfigReader cr;
    QStringList errorList;
    QStringList versionErrorList;
    QStringList titleErrorList;
    QStringList prepareErrorList;
    QStringList typeErrorList;
    QList<int> emptyTitleList;
    QList<int> duplicateList;
    QList<QPair<int, int>> checkErrorList;
    QStringList faildList;
    QStringList indexTitleList;                 // 索引表列标题列表
    int caseCount = 0;
    QXlsx::Worksheet* srcSht = nullptr;
    QXlsx::Worksheet *tmpSht = nullptr;
    lxw_workbook *dst_workbook = nullptr;
    lxw_worksheet *dst_worksheet = nullptr;
    QString logo_path;
    QString lFooter;
    QString rFooter;
    QString header;
    QString footer;
    QString font_setting;
    lxw_header_footer_options options = {0};
    QStringList sheetList;
    QString path;

};
#endif // MAINWINDOW_H
